/*
 * 最大乘积
 *
 * 题目链接：https://programming.pku.edu.cn/probset/c4b75386cfd8411991908475c4b91bc6/ef6b04b013a041418460f2df14868288/
 * 作者：lyazj <seeson@pku.edu.cn>
 *
 * 本题所需主要知识点：
 *   - 记忆化搜索或动态规划
 *
 * 记忆化搜索实现思路
 *   - key 可以选择为 (被分解的数, 因子下限) 等方案
 *   - value 不要存下完整的调用栈，而是只存最小的因子和最大乘积
 *   - 最后递归获取最优分解方案的所有因子即可
 */

#include <stdio.h>

// ************************************************************
// 特别注意
// 元素上百万的大数组开在 main 外面，防止栈溢出
// 也可以开在 main 里面，加上合适的 storage specifier，如 static
// 本题最大乘积会溢出 long long，可以用 double，更大时可取对数
// ************************************************************

// 需要分解的正整数
int n;

// [i, j] -> 需要分解的正整数为 i，因子不超过 j 时的最大乘积
double prod_max[1005][1005];

// [i, j] -> prod[i][j] 对应的最大因子
int prod_argmax[1005][1005];

// 答案
int ans[1005];

int main(void)
{
  scanf("%d", &n);

  for(int i = 1; i <= n; ++i) {    // 需要分解的正整数从 1 开始递推
    for(int j = 1; j <= i; ++j) {  // 枚举因子的上界（不一定是上确界）
      // 情形一：j 不是因子的上确界
      // 我们先将最优解赋值为情形一，后续情形遇到更优解时再覆盖
      prod_max[i][j] = prod_max[i][j - 1];
      prod_argmax[i][j] = prod_argmax[i][j - 1];

      // 情形二：j 是因子的上确界
      if(j != i) {
        // 首先分成 i - j 和 j 两部分
        // i - j 可以继续划分，但因子的上界变成了 j - 1
        if(prod_max[i - j][j - 1] * j > prod_max[i][j]) {
          prod_max[i][j] = prod_max[i - j][j - 1] * j;
          prod_argmax[i][j] = j;
        }
      } else {
        // 即不分解
        if(j > prod_max[i][j]) {
          prod_max[i][j] = j;
          prod_argmax[i][j] = j;
        }
      }
    }
    for(int j = i + 1; j <= n; ++j) {  // 继续枚举因子的上界
      // 比 i 更宽松的上界没有实际意义，故解均与 j = i 时相同
      prod_max[i][j] = prod_max[i][j - 1];
      prod_argmax[i][j] = prod_argmax[i][j - 1];
    }
  }

  // 提取最佳分解方案
  // 可以证明输出顺序满足从小到大，不放心的话你也可以排个序
  int *ansp = ans;
  while(n) n -= *ansp++ = prod_argmax[n][n];
  while(ansp != ans) printf("%d ", *--ansp);
  fseek(stdout, -1, SEEK_CUR);
  printf("\n");
  return 0;
}
